package com.github.paicoding.forum.core.mdc;
//MDC 是一种线程级别的上下文容器，本质是通过 ThreadLocal 实现的 “线程本地键值对存储”，
// 用于在多线程环境下为日志输出附加上下文信息（如 traceId、userId 等），实现 “一次请求链路中所有日志都携带相同标识” 的效果。
import org.slf4j.MDC;


public class MdcUtil {
    public static final String TRACE_ID_KEY = "traceId";

    // 向当前线程的 MDC 中添加一对键值对
    public static void add(String key, String val) {
        MDC.put(key, val);
    }

    public static void addTraceId() {
        // traceId的生成规则，技术派提供了两种生成策略，可以使用自定义的也可以使用SkyWalking; 实际项目中选择一种即可
        MDC.put(TRACE_ID_KEY, SelfTraceIdGenerator.generate());
    }

    public static String getTraceId() {
        return MDC.get(TRACE_ID_KEY);
    }

    public static void reset() {
        String traceId = MDC.get(TRACE_ID_KEY);
        MDC.clear();
        MDC.put(TRACE_ID_KEY, traceId);
    }

    public static void clear() {
        MDC.clear();
    }
}
